在表单加载时设置默认值
我们经常有在新增一个表单的时候,给一些表单的数据设置默认值的需求。在这里我们给出了一些代码片段来让我们快速了解如何通过 Client API 完成需求。
收入确认单新增时默认业务员为登录用户
下面的脚本演示了我们如何在新增一个收入确认单时,默认当前登录用户为业务员。
注意,这里的前提是需要开启登录用户的“允许业务引用”属性,并且该用户授予了“收入确认单”新增的权限。
/**
* 表单的默认值大多数情况是在 formOnLoad 这个入口点执行的。
*/
thisApp.formOnLoad = async (ctx) => {
const form = ctx.getFormContext().form;
/**
* 【1】给收入确认的业务员默认设置为当前登录用户
*/
await form.getField('ownerUser').selectUnique({
where: {
id: qiqi.runtime.loginUser.id, // 【2】找到 id 等于 当前登录用户 id
}
});
};
- 【1】给收入确认的业务员默认设置为当前登录用户
注意!给一个表单的业务对象字段赋值的时候,不能直接给该字段设置
id
。必须通过selectUnique
或者selectOne
这两个方法来完成。这是因为在表单录入过程中,当我们改变一个表单上的某个业务对象字段的时候,表单上面的其他一些字段会引用这个业务对象字段的其他属性来完成业务逻辑。selectUnique
或者selectOne
这两个方法会自动帮我们查询其他业务字段需要用到的属性。 - 【2】这里我们给的条件是
id
等于
qiqi.runtime.loginUser.id
。在qiqi
这个全局数据下面提供了诸如登录用户,登录组织,登录用户部门 这些基本信息。
报销单新增行默认费用和默认交通工具
下面的脚本演示了我们在新增一个差旅报销单时,我们默认选择当前登录用户上次差旅报销单的长途明细中的默认费用,默认交通工具我们设置为 “飞机”。
let defaultTransportsCost = null; // 默认的最近一次差旅报销单中,长途子表用到的费用。
let defaultTransportType = null; // 默认的交通工具设置为(飞机)
thisApp.formOnLoad = async (ctx) => {
const form = ctx.getFormContext().form;
const getDefaultTransportsCost = async () => {
// 我们查询当前用户最近一次录入的差旅报销单中,长途子表用到的费用
const lastSubGridItem = await ctx.getFormContext().entityQuery('ReimburseTransport')
.findOne({
limit: 1,
orderBy: {
createdTime: "desc"
},
where: {
createdUser: qiqi.runtime.loginUser.id,
costId: {
not: null
},
},
select: {
cost: true
}
});
// 存在数据,再查询费用对象
if (lastSubGridItem) {
return form.findOne('reimburseTransports.cost', {
where: {
// 通过 qiqi.util.get 函数,可以安全的访问数据
id: qiqi.util.get(lastSubGridItem, 'cost.id'),
}
})
}
}
const getDefaultTransportType = async () => {
// 我们默认交通工具为 “飞机”
return form.findOne('reimburseTransports.transport', {
limit: 1,
where: {
name: '飞机'
}
});
}
// 单据类型为 “差旅报销单” 的,我们才处理
if (form.value.billType.name === '差旅报销单') {
[defaultTransportsCost, defaultTransportType] = await Promise.all([
getDefaultTransportsCost(),
getDefaultTransportType(),
]);
console.log('defaultTransportsCost', defaultTransportsCost, 'defaultTransportType', defaultTransportType);
}
};
thisApp.subGridOnChanged = (ctx) => {
const form = ctx.getFormContext().form;
const { op, subGridName, currentField } = ctx.getCurrentContext();
if (subGridName === 'reimburseTransports' && op === "add") {
// 发生数据变化的子表为 reimburseTransports, 并且操作为 新增行时,我们填写默认值
if (defaultTransportsCost) {
currentField.getField('cost').value = defaultTransportsCost;
}
if (defaultTransportType) {
currentField.getField('transport').value = defaultTransportType;
}
}
};